/*
  加密算法
  题目描述
    使用一种加密算法
    设字符串的长度为 n，则构造一个矩阵，使得 r * c = n 且在 r <= c 的情况下使得 r 尽量大，
    构造出一个 r 行 c 列的矩阵。

    然后把给定的明文按照先从左往右，再从上到下的顺序填充这个 r * c 的矩阵。
    得到的密文就是把矩阵按照先从上往下，再从左往右的顺序输出的字符串。

    给定你明文，请你输出密文。
  输入描述
    一行，一个字符串，表示明文。
  输出描述
    一行，一个字符串，表示密文。
  样例1
    输入
      bok
    输出
      bok
  样例2
    输入
      koaski
    输出
      ksokai
    解释
      共 6 个字符，对于 r 行 m 列的矩阵，可以选择 1 × 6，2 × 3 这两种，因为要求 r 尽量大，所以选择 2 × 3。
      然后进行填充，填充的结果如下图所示。最后先从上到下，再从左到右输出每个字符即可。
         k  o  a
         s  k  i
  数据范围
    对于 100% 的数据，保证输入字符串只含小写字母，长度不超过 100。
*/

#include <iostream>

using namespace std;

string s;
int r, c; // r: 长  c: 宽
char ans[105][105];

int main() {
    cin >> s;

    int n = s.size();

    // 计算长宽，尽可能接近平方根为最大
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            r = i;      // 较小的约数 -- r 行
            c = n / i;  // 较大的约数 -- c 列
        }
    }

    int cnt = 0;
    for (int i = 0; i <= r - 1; i++) { // r 行
        for (int j = 0; j <= c - 1; j++) { // c 列
            // 存字符串
            ans[i][j] = s[cnt];
            cnt++;
        }
    }

    // 把矩阵按照先从上往下，再从左往右的顺序输出的字符串。
    for (int j = 0; j <= c - 1; j++) {
        for (int i = 0; i <= r - 1; i++){
            cout << ans[i][j];
        }
    }

    return 0;
}